Hito 1: Estudio de las recomendaciones de Steam¶

Grupo 03:

  • Adolfo Arenas P.
  • Alejandro Mori A.
  • Ignacio Humire S.
  • Leonardo Rikhardsson
  • Mario Benavente C.

Introducción¶

¿Qué es Steam?¶

Steam es una plataforma de distribución digital de videojuegos, software y contenido multimedia creada por Valve Corporation. Además tiene un ámbito social en torno a los videojuegos en donde a través de un perfil puedes conversar por chat, discutir en foros y compartir momentos en formato de fotos o videos en las comunidades de los distintos juegos. Por otra parte, Steam ofrece características como la integración de logros, estadísticas de juego, recomendaciones de producto, entre otras cosas

Motivación¶

Cada vez hay más personas que consumen videojuegos en el mundo, y con ello, más juegos salen al mercado para satisfacer la demanda. Con tantos de ellos, las personas no tienen el tiempo suficiente para probar cada uno de estos.

Como grupo encontramos un interés común con el tema escogido respecto a la manera en que empresas como Steam, donde desarrolladores pueden publicar y vender sus juegos, recomiendan juegos a usuarios de la plataforma o cómo los desarrolladores analizan el mercado para garantizar el éxito de su producto.

Nos gustaría ver si, eventualmente, logramos entender cómo funciona el proceso de recomendación de juegos o qué tipo de juego crear para lanzar en los próximos años por dar algunos ejemplos.


Exploración de Datos¶

Se usarán 2 DataSets:

  • Steam Games Dataset: Contiene información sobre cada juego (género de juego, precio, cantidad de reviews, etc).

  • Game Recommendations on Steam: Contiene información más detallada sobre las reviews de usuarios por juego (positivo/negativo, fecha, horas de juego, ID de usuario, etc).

A pesar de que las tablas tienen distintos atributos, podemos realizar Joins para unirlas, ya que comparten el atributo app_id (ID el cual es dado por Steam y es único para cada juego). Cada review también tiene una propia ID del usuario que la publicó, útil para crear relaciones con respecto al género de los videojuegos.

In [1]:
# @title Imports
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from wordcloud import WordCloud
import os
import csv
import json
In [2]:
# Codigo para que la parte interactiva se vea en el HTML

import plotly.io as pio
pio.renderers.default='notebook'
In [3]:
# @title Exportación de Drive
from google.colab import drive
drive.mount('/content/drive')
Mounted at /content/drive

Primero cargamos los datos que serán usados para nuestra exploración de datos.

In [4]:
# @title Carga de DataFrames
df_games = pd.read_csv('/content/drive/MyDrive/CC5205/games.csv', encoding="UTF-8")
df_recom = pd.read_csv('/content/drive/MyDrive/CC5205/recommendations.csv', encoding="UTF-8")
df_recom.head()
Out[4]:
app_id helpful funny date is_recommended hours user_id review_id
0 975370 0 0 2022-12-12 True 36.3 51580 0
1 304390 4 0 2017-02-17 False 11.5 2586 1
2 1085660 2 0 2019-11-17 True 336.5 253880 2
3 703080 0 0 2022-09-23 True 27.4 259432 3
4 526870 0 0 2021-01-10 True 7.9 23869 4

Podemos tomar a un usuario que haya recomendado a lo menos dos juegos y revisar sus preferencias con respecto a los juegos que le hayan gustado y sus respectivos géneros. Si realizamos esto con un mayor número de jugadores se podrían encontrar patrones entre géneros de videojuegos, los cuales podrían ser estudiados ocupando visualizacion de datos, en específico, WordCloud.

In [5]:
# @title WordCloud
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(df_games['genres'].to_string())

#Mostrar la nube de palabras
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')  #Desactivar los ejes
plt.show()

Como se puede ver, la gran mayoría corresponde a juegos de acción y aventura (que suele ser la mayoría de las producciones AAA). Además, se repite la palabra indie, que hace alusión a aquellos juegos creados por desarrolladores independientes.

Podemos ver la satisfacción general de todos los usuarios de steam comparando la cantidad de juegos recomendados v/s los no recomendados.

In [6]:
frequency_recom = df_recom['is_recommended'].value_counts()

# Mostrar la tabla de frecuencias
print(frequency_recom)
is_recommended
True     35304398
False     5850396
Name: count, dtype: int64

Otro análisis que haríamos sería buscar una posible relación entre el precio de los juegos y la cantidad de reviews de los usuarios. La mejor herramienta que nos ayudará a estudiar esto es un diagrama de dispersión. Además, mostraremos los outliers para dar cuenta de situaciones particulares dentro de la plataforma.

In [7]:
# @title Diagrama de Dispersión
import plotly.express as px

# Crear el scatter plot
fig_scatter = px.scatter(df_games,
                         x='price',
                         y='recommendations',
                         color='metacritic_score',
                         title='Scatter Plot: Precio vs Número Total de Reseñas',
                         labels={'price': 'Precio (USD)', 'recommendations': 'Número Total de Recomendaciones'})

fig_scatter.show()

Del gráfico podemos notar que todo juego sobre los 75 dólares en adelante tiene una puntuación de 0 (según la tabla de colores a la derecha, no son puntuaciones mayores a 10 al parecer) ya sea por una mala puntuación de parte de metacritic o simplemente no fueron puntuados. Por otro lado, notamos que juegos con puntuaciones altas en Metacritic suelen ser juegos de no más de 30 dólares y con al menos 100 mil reseñas.

Sumado a esto, si revisamos los outliers, los juegos más caros no tienen ni reseñas ni puntuación, ya que los usuarios deben comprar el producto, mientras que el juego con más reviews (por sobre 3 millones) tiene un rating muy alto, seguido de otros dos juegos con sobre 1 millón de reseñas, donde uno está mal evaluado y el otro bien calificado.

In [8]:
# @title Gráfico de Barras 1
import plotly.graph_objs as go
import plotly.offline as pyo

# Filtrar los datos para que muestre juegos con reviews tanto positivas como negativas
filter = df_games[(df_games['positive'] > 0) &
                  (df_games['negative'] > 0)]

top_games = filter[filter["name"] != "Grand Theft Auto V"].sort_values(by='metacritic_score', ascending=False).head(3)

# Crear la figura de barras
fig = go.Figure(go.Bar(
    x=top_games['name'],
    y=top_games['positive']
))

# Actualizar el diseño del gráfico
fig.update_layout(
    title='Cantidad de reviews positivas del top 3 de juegos con mejor puntaje de metacritic',
    xaxis=dict(title='Juegos'),
    yaxis=dict(title='Cantidad')
)

fig.show()
In [9]:
# @title Gráfico de Barras 2
# Crear la figura de barras
fig = go.Figure(go.Bar(
    x=top_games['name'],
    y=top_games['negative']
))

# Actualizar el diseño del gráfico
fig.update_layout(
    title='Cantidad de reviews negativas del top 3 de juegos con mejor puntaje de metacritic',
    xaxis=dict(title='Juegos'),
    yaxis=dict(title='Cantidad')
)

fig.show()

Con respecto a estos gráficos de barra, queríamos ver si era posible observar algo con respecto a un top 3 de juegos de Steam con mejor puntuación en Metacritic y contrastarlo con la cantidad de reviews positivas y negativas que recibieron en Steam. Dentro del top 3 se encontraba "Grand Theft Auto V", el cual decidimos remover puesto que, en comparación con los otros juegos, la cantidad de reseñas de jugadores que recibió era mucho mayor, lo que entorpecía la visualización de los gráficos. Es importante destacar que la puntuación en Metacritic y las reseñas positivas y negativas de Steam de un juego son eventos separados.


Preguntas¶

A partir de nuestra motivación y lo que encontramos en la exploración preliminar de datos, nos surgieron las siguientes preguntas que encontramos interesantes para estudiar el dataset:

  1. ¿Qué atributos en común tienen los juegos con más reseñas positivas que negativas en steam?
  2. ¿Es posible predecir la aprobación que tendrá un juego que está por lanzarse considerando sus atributos?
  3. ¿Se encuentran patrones frecuentes entre grupos de atributos en los datos de los juegos de Steam?

>


Contribuciones de cada integrante¶

  • Adolfo Arenas: Creación del Canva(PPT), el diseño y encargado de cargar los datos desde Google Drive.
  • Alejandro Mori: A cargo de la redacción de las preguntas y los motivos.
  • Ignacio Humire: Encargado de la limpieza de los datos, además del diseño del PPT
  • Leonardo Rikhardsson: Estuvo a cargo de la creación de diagramas, tablas y código.
  • Mario Benavente: Redactar cada parte de los análisis y Exploración de datos.